// 20.4 类特化 (Class Specialization)

1.基本概念
类特化允许我们为特定类型或类型组合提供定制的实现：
// 主模板
template <typename T>
class Container {
private:
    T* elements;
    size_t size;
public:
    // 通用实现...
};

// 针对bool类型的完全特化
template <>
class Container<bool> {
private:
    std::vector<bool> elements;  // 使用更高效的存储
public:
    // 针对bool的特殊实现...
};

2.基于类型特性的特化
除了为具体类型提供特化外，我们还可以基于类型特性进行特化：
// 主模板
template <typename T, typename = void>
class Serializer {
public:
    static void serialize(std::ostream& out, const T& value) {
        // 通用序列化实现...
    }
};

// 针对有序列化方法的类型的特化
template <typename T>
class Serializer<T, std::void_t<decltype(std::declval<T>().serialize(std::declval<std::ostream&>()))>> {
public:
    static void serialize(std::ostream& out, const T& value) {
        // 调用类型自己的序列化方法
        value.serialize(out);
    }
};

3.部分特化 (Partial Specialization)
部分特化允许我们为一组相关类型提供特殊实现：
// 主模板
template <typename T, typename U>
class Pair {
    // 通用实现...
};

// 针对相同类型的部分特化
template <typename T>
class Pair<T, T> {
    // 当两个类型相同时的实现...
};

// 针对指针类型的部分特化
template <typename T, typename U>
class Pair<T*, U*> {
    // 当两个类型都是指针时的实现...
};

4.标签调度与类特化
标签调度也可以用于类模板：
// 类型标签
struct pod_type_tag {};
struct non_pod_type_tag {};

// 类型特性检测
template <typename T>
struct type_traits {
    using category = typename std::conditional<
        std::is_pod_v<T>,
        pod_type_tag,
        non_pod_type_tag
    >::type;
};

// 主模板
template <typename T, typename Tag = typename type_traits<T>::category>
class Optimizer {
    // 默认实现...
};

// POD类型的特化
template <typename T>
class Optimizer<T, pod_type_tag> {
    // 针对POD类型的优化实现...
};

// 非POD类型的特化
template <typename T>
class Optimizer<T, non_pod_type_tag> {
    // 针对非POD类型的实现...
};
